package com.ruoyi.crm.service.impl;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.AuditStatus;
import com.ruoyi.common.enums.erp.CrmTaskEnum;
import com.ruoyi.common.enums.flow.FlowTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.flow.FlowDTO;
import com.ruoyi.common.utils.flow.FlowParamsUtils;
import com.ruoyi.crm.domain.*;
import com.ruoyi.crm.service.ICrmCustomerService;
import com.ruoyi.crm.service.ICrmOrderService;
import com.ruoyi.crm.utils.ThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.crm.mapper.CrmTaskMapper;
import com.ruoyi.crm.service.ICrmTaskService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import static com.ruoyi.common.utils.DateUtils.differentDaysByMillisecond;

/**
 * 工单列表Service业务层处理
 *
 * @author 最帅的陈彬彬
 * @date 2024-12-07
 */
@Service
public class CrmTaskServiceImpl extends ServiceImpl<CrmTaskMapper,CrmTask> implements ICrmTaskService {
    @Autowired
    private CrmTaskMapper crmTaskMapper;

    /**
     * 查询工单列表
     *
     * @param id 工单列表主键
     * @return 工单列表
     */
    @Override
    public CrmTask selectCrmTaskById(String id)
    {
        return crmTaskMapper.selectById(id);
    }

    /**
     * 查询工单列表列表
     *
     * @param crmTask 工单列表
     * @return 工单列表
     */
    @Override
    public List<CrmTask> selectCrmTaskList(CrmTask crmTask) {
        if(!SecurityUtils.hasAdmin()){
            crmTask.setUserId(SecurityUtils.getUserId());
        }
        return crmTaskMapper.selectCrmTaskList(crmTask);
    }

    /**
     * 新增工单列表
     *
     * @param crmTask 工单列表
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertCrmTask(CrmTask crmTask) {
        crmTask.setCreateBy(SecurityUtils.getUsername());
        crmTask.setCreateTime(DateUtils.getNowDate());
        crmTask.setCreateUserId(SecurityUtils.getUserId());
        //计算出实际完成天数
        int days = differentDaysByMillisecond(crmTask.getStartTime(), crmTask.getEndTime());
        crmTask.setActualDay(new BigDecimal(days));
        crmTask.setStatus("0");
        return crmTaskMapper.insert(crmTask);
    }

    /**
     * 修改工单列表
     *
     * @param crmTask 工单列表
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateCrmTask(CrmTask crmTask) {
        crmTask.setUpdateBy(SecurityUtils.getUsername());
        crmTask.setUpdateTime(DateUtils.getNowDate());
        crmTask.setCreateUserId(SecurityUtils.getUserId());
        //计算出实际完成天数
        int days = differentDaysByMillisecond(crmTask.getStartTime(), crmTask.getEndTime());
        crmTask.setActualDay(new BigDecimal(days));
        return crmTaskMapper.updateById(crmTask);
    }

    /**
     * 批量删除工单列表
     *
     * @param ids 需要删除的工单列表主键
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int deleteCrmTaskByIds(String[] ids)
    {
        return crmTaskMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 删除工单列表信息
     *
     * @param id 工单列表主键
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int deleteCrmTaskById(String id)
    {
        return crmTaskMapper.deleteById(id);
    }

    /**
     * 完成工单列表关联工作流
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean accomplishTaskInfo(CrmTask crmTask) {
        CrmTask task = baseMapper.selectById(crmTask.getId());
        if (ObjectUtils.isEmpty(task)){
            throw new ServiceException("工单数据不存在，请刷新后重试");
        }
        //设置审核状态 待审核
        task.setAuditStatus(AuditStatus.AWAIT_SUBMIT.getCode());
        //实际天数
        task.setActualDay(crmTask.getActualDay());
        task.setStatus("1");
        //开启工作流
        FlowParamsUtils.start(task, "flow-crmTask", task.getId());
        return this.updateById(task);
    }

    /**
     * 审核
     *
     * @param crmTask
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean audit(CrmTask crmTask) {
        CrmTask task = baseMapper.selectById(crmTask.getId());

        if (ObjectUtils.isEmpty(task)){
            throw new ServiceException("工单数据不存在，请刷新后重试");
        }
        FlowParamsUtils.skip(crmTask, "");
        return this.updateById(crmTask);
    }

    @Override
    public FlowDTO conversionObj(Serializable id) {
        CrmTask task = baseMapper.getById(id);
        FlowDTO flowDTO = this.buildFlowDTO(task);
        return flowDTO;
    }

    @Override
    public FlowDTO conversionObjByLocal(Serializable id) {
        FlowDTO flowDTO = this.conversionObj(id);
        return flowDTO;
    }

    private FlowDTO buildFlowDTO( CrmTask task ){
        FlowDTO flowDTO = new FlowDTO(task);
        Map<String, Object> businessValue = flowDTO.getBusinessValue();
        businessValue.put("项目名称", task.getOrderName());
        businessValue.put("客户名称", task.getCustomerName());
        businessValue.put("工单类型", CrmTaskEnum.getDescription(task.getTaskType()));
        return flowDTO;
    }
}
